IAT 2차 문제를 동료에게 설명하기

  1. letterCapitalize 문제를 풀어나간 생각 흐름을 그대로 적어보았습니다.

    크롬 개발자 도구를 사용해서 풀어나갔어요.

    -> 아침에 일어나서 다시 생각해보니, 이렇게 어렵게 풀 이유가 없었음;; for문 한번이면 충분했고… 맨 처음 바꿔주고, 공백 다음에 문자열이 올 경우에만 대문자로 바꿔주면 되었을텐데. 술 먹은 날 새벽 코딩의 한계…

    // 수정버전
    function letterCapitalize(str) {
     var capitalizeStr = ''
    
     for (var i = 0; i < str.length; i++) {
       if ((str[i - 1] === undefined || str[i - 1] === ' ') && str[i] !== ' ') {
         capitalizeStr += str[i].toUpperCase()
       } else {
         capitalizeStr += str[i]
       }
     }
    
     return capitalizeStr
    }
// 술 먹은 버전;
/*
letterCapitalize 함수를 작성합니다.

string이 input으로 주어지면, 각 단어의 첫 번째 글자를 대문자로 만들어 리턴합니다.
단어 사이는 공백이 있을 수 있습니다.

letterCapitalize("hello world");        // => "Hello World"
letterCapitalize("javascript is sexy")  // => "Javascript Is Sexy"
letterCapitalize("keep   the spaces  ") // => "Keep   The Spaces  "

*/

풀이 진행과정

//초안은 지인에게 말로 설명함.

//말로 설명했던, 즉 슈도 코드를 코드로 구현.
//아래 코드는 스스로에게 하는 말이기에 반말로 서술.
function letterCapitalize(str) {
	var string = '';
	var stringArr = [];

    for (var i=0; i<str.length; i++) {
        string += str[i];
        if (str[i+1] === ' ' || str[i+1] === undefined) {
            // 슈도 코드엔 없었던 코드화 해주면서 추가된 undefined 조건.
            // 문장이 끝날 경우에 push 처리가 실행 안 된다는 게 생각남.
            stringArr.push(string);
            string = '';
        }
    }

    for (var k=0; k<stringArr.length; k++) {
        if (stringArr[k].indexOf(' ') === -1) {
            stringArr[k] = stringArr[k][0].toUpperclass();
//생각해보니 배열 하나기에 indexOf를 쓸 수 없지 않나?. 곧 바로 다시 생각해보니 문자열에도 indexOf를 쓸 수 있음.
        }
    }

    return stringArr;

}

// 만들었으니 문제에 제시되었던 예를 넣어서 실험해보자
letterCapitalize("hello world");
// 잉 에러?
VM3338:17 Uncaught TypeError: stringArr[k][0].toUpperclass is not a function
    at letterCapitalize (<anonymous>:17:44)
    at <anonymous>:1:1
letterCapitalize @ VM3338:17
(anonymous) @ VM3340:1

// 뭐지? 대문자로 만들어주는 함수를 잘못 썼나? mdn에 쳐보자.
// 쳐봤더니 toUpperclass가 아니라 toUpperCase였던것.

function letterCapitalize(str) {
	var string = '';
	var stringArr = [];

    for (var i=0; i<str.length; i++) {
        string += str[i];
        if (str[i+1] === ' ' || str[i+1] === undefined) {
            stringArr.push(string);
            string = '';
        }
    }

    for (var k=0; k<stringArr.length; k++) {
        if (stringArr[k].indexOf(' ') === -1) {
            stringArr[k] = stringArr[k][0].toUpperCase();
            //toUpperCase로 수정해줌.
        }
    }

    return stringArr;

}
letterCapitalize("hello world");
(2) ["H", " world"]
//잉? 왜 H만 대문자지? 나머지 문자열은 어디갔어?

function letterCapitalize(str) {
	var string = '';
	var stringArr = [];

    for (var i=0; i<str.length; i++) {
        string += str[i];
        if (str[i+1] === ' ' || str[i+1] === undefined) {
            stringArr.push(string);
            string = '';
        }
    }

    for (var k=0; k<stringArr.length; k++) {
        if (stringArr[k].indexOf(' ') === -1) {
            stringArr[k] = stringArr[k][0].toUpperCase() + stringArr[k].slice(1);
            //다시 소스를 봤더니, 앞글자만 대문자 만들어주고 나머지 문자는 넣을 생각을 안 했네... slice로 잘라서 붙여주자!
        }
    }

    return stringArr;

}
letterCapitalize("hello world");
(2) ["Hello", " world"]
// 좋아. 앞글자 대문자로 만드는데는 성공했어. 그런데 왜 가운데 공백은 world랑 붙어있지?

function letterCapitalize(str) {
	var string = '';
	var stringArr = [];

    for (var i=0; i<str.length; i++) {
        string += str[i];
        if (str[i+1] === ' ' || str[i+1] === undefined) {
            stringArr.push(string);
            string = '';
        }
    }
	console.log(stringArr);
    //뭐가 문제인지 확인하기 위해 콘솔로그를 찍어봄.

    for (var k=0; k<stringArr.length; k++) {
        if (stringArr[k].indexOf(' ') === -1) {
            stringArr[k] = stringArr[k][0].toUpperCase() + stringArr[k].slice(1);
        }
    }

    return stringArr;

}
undefined
letterCapitalize("hello world");
(2) ["hello", " world"] //console.log 찍은 부분.
(2) ["Hello", " world"]
// 공백world 부분이 제대로 작동하지 않음. 왜냐하면 공백이 하나만 있을 경우를 생각하지 못했음.
// 하나일 경우에 바로 뒤에 문자열이 나오기 때문에 push가 실행이 안 되고 계속 진행됨.

// 어떻게든 공백이 하나일 경우에 잘라줘야 하는데, 이 경우엔 스스로(str[i])가 공백이고,
// 다음(str[i+1])이 문자일 경우를 넣어주면 되지 않을까?

function letterCapitalize(str) {
	var string = '';
	var stringArr = [];

    for (var i=0; i<str.length; i++) {
        string += str[i];
        if (str[i+1] === ' ' || str[i+1] === undefined || str[i] === ' ' && str[i+1] !== ' ') {
            //공백 한 글자 경우를 맞춰줌.
            stringArr.push(string);
            string = '';
        }
    }
	console.log(stringArr);

    for (var k=0; k<stringArr.length; k++) {
        if (stringArr[k].indexOf(' ') === -1) {
            stringArr[k] = stringArr[k][0].toUpperCase() + stringArr[k].slice(1);
        }
    }

    return stringArr;


}

letterCapitalize("hello world");
(3) ["hello", " ", "world"]
(3) ["Hello", " ", "World"]
// 정상 작동하는걸로 보인다! 중간에 썼던 console를 정리해주고, join 해주면 될 것 같다...

function letterCapitalize(str) {
	var string = '';
	var stringArr = [];

    for (var i=0; i<str.length; i++) {
        string += str[i];
        if (str[i+1] === ' ' || str[i+1] === undefined || str[i] === ' ' && str[i+1] !== ' ') {
            stringArr.push(string);
            string = '';
        }
    }
    //콘솔로그 부분 정리함

    for (var k=0; k<stringArr.length; k++) {
        if (stringArr[k].indexOf(' ') === -1) {
            stringArr[k] = stringArr[k][0].toUpperCase() + stringArr[k].slice(1);
        }
    }

    return stringArr.join('');
	//조인 해줌.

}
letterCapitalize("hello world");
"Hello World"
// 작동함 다른 예제를 가져와보자
letterCapitalize("javascript is sexy")  // => "Javascript Is Sexy"
"Javascript Is Sexy"
//ok

//그럼 대망의 마지막

letterCapitalize("keep   the spaces  ") // => "Keep   The Spaces  "
"Keep   The Spaces  "
//완료!

2.

/*
makeFib 함수를 작성합니다.

makeFib 함수는 클로저의 형태로 작성되며, 리턴된 함수가 호출될 때마다 피보나치 수열을 순차적으로 출력합니다.
피보나치 수는 0과 1로 시작하며, 다음 피보나치 수는 바로 앞의 두 피보나치 수의 합이 됩니다.

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...

이 함수는 recursive 혹은 iterative한 방법 중 어떤 방법으로든 구현할 수 있습니다.

예제
---

var fn = makeFib();
fn(); // 0
fn(); // 1
fn(); // 1
fn(); // 2
fn(); // 3
fn(); // 5

*/

var result = [0, 1]
var count = -1
var fn = function makeFib() {
  result.push(result[result.length - 1] + result[result.length - 2])
  count += 1
  return result[count]
}
// 역시 이 문제도 머리로 생각했던 부분과 실제로 구현되면서 좀 달라진 부분들이 존재합니다. count 부분이 추가되었죠.
// fn() 첫 시작이 0부터라는 걸 간과했더라구요. 어떻게 해결할까 하다가, index 개념의 카운트를 넣어주면 간단하지 않을까? 싶었습니다.
// 막 깔끔하진 않지만 어쨌든 해결은 됐네요.

// 위의 코드를 specrunner 조건에 맞게 수정한 버전.
function makeFib() {
  // your code here
  var result = [0, 1]
  var count = -1
  return function() {
    result.push(result[result.length - 1] + result[result.length - 2])
    count += 1
    return result[count]
  }
}

lastrites2018
Written bylastrites2018
I explain with words and code.

👉삽질의 역사는 노션 WIKI에서